\bibliographystyle{gbt7714-2005}

\chapter{PHP简介}

\epigraphhead[60]{\epigraph{你不能强迫人们改变。相反，要向他们展示未来可能会怎样，并帮助他们参与对未来的创造。}{Andrew Hunt, DavidThomas\textit{程序员修炼之道}}}

PHP，即“PHP: Hypertext Preprocessor”，是一种被广泛应用的开源通用脚本语言，尤其适用于 Web 开发并可嵌入 HTML 中去。它的语法利用了 C、Java 和 Perl，易于学习。该语言的主要目标是允许 web 开发人员快速编写动态生成的 web 页面。

\section{PHP简史}

PHP 继承自一个古老的工程，名叫 PHP/FI。PHP/FI 在 1995 年由 Rasmus Lerdorf 创建，最初只是一套简单的 Perl 脚本，用来跟踪访问他主页的人们的信息。它给这一套脚本取名为“Personal Home Page Tools”。随着更多功能需求的增加，Rasmus 写了一个更大的 C 语言的实现，它可以访问数据库，可以让用户开发简单的动态 Web 程序。Rasmus » 发布了 PHP/FI 的源代码，以便每个人都可以使用它，同时大家也可以修正它的 Bug 并且改进它的源代码。

\subsection{PHP/FI}

PHP/FI，一个专为个人主页／表单提供解释程序的程序，已经包含了今天 PHP 的一些基本功能。它有着 Perl 样式的变量，自动解释表单变量，并可以嵌入 HTML。语法本身与 Perl 很相似，但是它很简单，还稍微有些不协调。

到1997年，PHP/FI 2.0，也就是它的 C 语言实现的第二版在全世界已经有几千个用户（估计）和大约 50,000 个域名安装，大约是 Internet 所有域名的 1\%。但是那时只有几个人在为该工程撰写少量当代码，它仍然只是一个人的工程。

PHP/FI 2.0 在经历了数个 beta 版本的发布后于 1997 年 11 月发布了官方正式版本。不久，PHP 3.0 的第一个 alpha 版本的发布，PHP 从此走向了成功。

\subsection{PHP 3}

PHP 3.0 是类似于当今 PHP 语法结构的第一个版本。Andi Gutmans 和 Zeev Suraski 在为一所大学的项目中开发电子商务程序时发现 PHP/FI 2.0 功能明显不足，于是他们重写了代码。这就是 PHP 3.0。经过Andi，Rasmus 和 Zeev 一系列的努力，考虑到 PHP/FI 已存在的用户群，他们决定联合发布 PHP 3.0 作为 PHP/FI 2.0 的官方后继版本。而 PHP/FI 2.0 的进一步开发几乎终止了。

PHP 3.0 的一个最强大的功能是它的可扩展性。除了给最终用户提供数据库、协议和 API 的基础结构，它的可扩展性还吸引了大量的开发人员加入并提交新的模块。后来证实，这是 PHP 3.0 取得巨大成功的关键。PHP 3.0 中的其它关键功能包括面向对象的支持和更强大和协调的语法结构。

这个全新的语言伴随着一个新的名称发布。它从 PHP/FI 2.0 的名称中移去了暗含“本语言只限于个人使用”的部分。它被命名为简单的缩写“PHP”。这是一种递归的缩写，它的全称是——PHP: Hypertext Preprocessor。

1998 年末，PHP 的安装人数几近 10,000，有大约 100,000 个网站报告他们使用了 PHP。在 PHP 3.0 的顶峰，Internet 上 10\% 的 web 服务器上都安装了它。

约九个月的公开测试后，官方于 1998 年 6 月正式发布 PHP 3.0。

\subsection{PHP 4}

1998 年的冬天，PHP 3.0 官方发布不久，Andi Gutmans 和 Zeev Suraski 开始重新编写 PHP 代码。设计目标是增强复杂程序运行时的性能和 PHP 自身代码的模块性。PHP 3.0 的新功能和广泛的第三方数据库、API的支持使得这样程序的编写成为可能，但是 PHP 3.0 没有高效处理如此复杂程序的能力。

新的被称为“Zend Engine”（这是 Zeev 和 Andi 的缩写）的引擎，成功的实现了设计目标，并在 1999 年中期首次引入 PHP。基于该引擎并结合了更多新功能的 PHP 4.0，在 PHP 3.0 发布两年后，于2000年5月发布了官方正式版本。除了更高的性能以外，PHP 4.0 还包含了其它一些关键功能，比如：支持更多的 web 服务器；HTTP Sessions 支持；输出缓冲；更安全的处理用户输入的方法；一些新的语言结构。

今天，已经有 10,000 名开发人员（估计）和几百万网站报告已安装了 PHP，占整个 Internet 域名的 20\%。

PHP 的开发小组有很多优秀的开发人员，同时还有大量的优秀人才在进行 PHP 相关工程的开发工作，如 PEAR 和 PHP 文档的工程。

\subsection{PHP 5}

PHP 5 在长时间的开发及多个预发布版本后，于 2004 年 7 月发布正式版本。它的核心是 Zend 引擎 2 代，引入了新的对象模型和大量新功能。

\subsection{PHP 7}
2015年12月，PHP迎来自2004年以来最大的飞跃，PHP 7正式发布。PHP 7最大特色是极大地改进了性能，在一些WordPress基准测试当中，性能可以达到PHP 5.6的3倍。一个20年来历经了多次改版和无数次优化的成熟语言，还能有性能提高一倍的突破绝非易事。

PHP已经是第四大最流行的编程语言，驱动全球超过2亿多个网站，全球超过81.7\%的公共网站在服务器端采用PHP。\cite{QSuccess，2016}

\section{PHP特点}
\begin{description}
	\item [开源免费] 由于PHP的解释器的源代码是公开的，所以安全系数较高的网站可以自己更改PHP的解释程序。另外，PHP运行环境的使用也是免费的。
	\item [跨平台] 由于PHP的解释器是开源的，所以能够在所有的操作系统平台上非常稳定地运行，这使它成为常用的服务器语言。
	\item [容易学习] PHP是一种非常容易学习和使用的一门语言，它的语法特点类似于C语言，但又没有C语言复杂的地址操作，而且又加入了面向对象的概念，再加上它具有简洁的语法规则，使得它操作编辑非常简单，实用性很强。
	\item [面向过程和面向对象并用] 在PHP语言的使用中，可以分别使用面向过程和面向对象，而且可以将PHP面向过程和面向对象两者一起混用，这是其他很多编程语言是做不到的。
	\item [运行高效] 由于PHP运行在相应的平台解释器上，消耗系统资源比较少，运行的环境简单，所以效率就很高。
	\item [数据库支持广泛]。PHP可以与很多主流的数据库建立起连接，如MySQL、ODBC、Oracle、AdabasD、S等，PHP是利用编译的不同函数与这些数据库建立起连接的，PHPLIB就是常用的为一般事务提供的基库。
	\item [生态系统完善] 围绕着PHP，在互联网上已经形成了繁荣完善的PHP生态体系，初学者可以在网络中找到几乎任何和PHP有关的资源，包括文档、教程、扩展库、框架、建站系统等等。
\end{description}

\section{PHP知名应用}
PHP 能做任何事。PHP 主要是用于服务端的脚本程序，因此可以用 PHP 来完成任何其它的 CGI 程序能够完成的工作，例如收集表单数据，生成动态网页，或者发送／接收 Cookies。但 PHP 的功能远不局限于此。

PHP 脚本主要用于以下三个领域：
\begin{enumerate}
	\item 服务端脚本。这是 PHP 最传统，也是最主要的目标领域。开展这项工作需要具备以下三点：PHP 解析器（CGI 或者服务器模块）、web 服务器和 web 浏览器。需要在运行 web 服务器时，安装并配置 PHP，然后，可以用 web 浏览器来访问 PHP 程序的输出，即浏览服务端的 PHP 页面。
	\item 命令行脚本。可以编写一段 PHP 脚本，并且不需要任何服务器或者浏览器来运行它。通过这种方式，仅仅只需要 PHP 解析器来执行。这种用法对于依赖 cron（Unix 或者 Linux 环境）或者 Task Scheduler（Windows 环境）的日常运行的脚本来说是理想的选择。
	\item 编写桌面应用程序。对于有着图形界面的桌面应用程序来说，PHP 或许不是一种最好的语言，但是如果用户非常精通 PHP，并且希望在客户端应用程序中使用 PHP 的一些高级特性，可以利用 PHP-GTK 来编写这些程序。
\end{enumerate}

以下这些网站采用PHP作为服务器端开发语言：
\begin{description}
	\item [Facebook.com] Facebook是世界上最大的社交网络服务网站，于2004年2月4日上线。主要创始人为美国人马克·扎克伯格。截至2015年7月，Facebook公司的每月活跃用户总数其实已经超过了22亿人。
	\item [Baidu.com] 全球最大的中文搜索引擎、最大的中文网站。
	\item [Wikipedia.org] 维基百科（Wikipedia），是一个基于维基技术的多语言百科全书协作计划，这是一部用多种语言编写的网络百科全书，也是世界上访问量最大的百科全书网站。
	\item [Qq.com] 腾讯网(www.QQ.com)是中国浏览量最大的中文门户网站,是腾讯公司推出的集新闻信息、互动社区、娱乐产品和基础服务为一体的大型综合门户网站。
	\item [Twitter.com] Twitter是一家美国社交网络及微博客服务的网站，是全球互联网上访问量最大的十个网站之一。是微博客的典型应用。
	\item [Taobao.com] 淘宝网是中国最大的网络零售系统。
	\item [Sina.com.cn] 新浪网为全球用户24小时提供全面及时的中文资讯，内容覆盖国内外突发新闻事件、体坛赛事、娱乐时尚、产业资讯、实用信息等，设有新闻、体育、娱乐、财经、科技等等。
	\item [weibo.com] 新浪微博是全中国最主流，最具人气，当前最火爆的微博产品。
	\item [Vk.com] VK 是最大的欧洲社交网站，每天活跃用户超过1000万。
	\item [Aliexpress.com] 速卖通，阿里巴巴全球在线交易平台。
	\item [Wordpress.com] 全球最大的博客站点，也是是全球访问量最大的站点之一。
\end{description}

以下这些建站工具采用PHP作为开发语言：
\begin{description}
	\item [Wordpress] WordPress是一个注重美学、易用性和网络标准的个人信息发布平台。
	\item [Discuz] 是一个采用 PHP 和 MySQL 等其他多种数据库构建的性能优异、功能全面、安全稳定的社区论坛平台,是全球市场占有率第一的社区论坛(BBS)软件。
	\item [MediaWiki] MediaWiki全球最著名的开源wiki程序，运行于PHP+MySQL环境。MediaWiki从2002年2月25日被作为维基百科全书的系统软件，并有大量其他应用实例。
	\item [DedeCMS] 织梦建站工具是国内开发的CMS，基本包含了一个常规网站需要的一切功能。易学易用，织梦拥有完善的中文学习资料。
	\item [PHPCMS] PHPCMS内容管理系统采用OOP（面向对象）方式自主开发的框架。框架易扩展，稳定且具有超强大负载能力，完全可以满足政府机构、教育机构、事业单位、商业企业、个人站长使用。
\end{description}

\section{PHP开发环境}
PHP的开发环境需要web服务器和PHP解释器以及数据库服务器。但是这些软件的安装和配置对于大多数初学者而言，是比较复杂的。为了解决这一问题，出现了众多的集成安装包（如WAMP、PHPStudy、XAMPP等等），即把PHP开发需要的软件打包在一起，并且做好了重要的配置工作，大大简化了搭建PHP开发环境的难度。

XAMPP是完全免费且易于安装的Apache发行版，其中包含MariaDB、PHP和Perl。XAMPP开放源码包的设置让安装和使用出奇容易。XAMPP支持多个平台，如Windows、Linux和OS X。我们选择对应的平台，下载合适的版本完成安装后，我们就拥有了一个本地化的PHP开发运行环境，启动浏览器，在地址栏中键入：

\begin{lstlisting}
http://localhost
\end{lstlisting}
就能看到XAMPP的欢迎界面，表明安装成功。

\subsection{第一个 PHP 页面}
在 web 服务器根目录（DOCUMENT\_ROOT）下（具体到XAMPP集成环境中，是xampp目录中的htdocs目录），建立一个文件名为 hello.php，然后完成如下内容：

\begin{lstlisting}
<html>
 <head>
  <title>PHP 测试</title>
 </head>
 <body>
 <?php echo '<p>Hello World</p>'; ?>
 </body>
</html>
\end{lstlisting}

在浏览器的地址栏里输入 web 服务器的 URL 访问这个文件，在结尾加上“/hello.php”。如果本地开发，那么这个 URL 一般是 http://localhost/hello.php 或者 http://127.0.0.1/hello.php，当然这取决于 web 服务器的设置。如果所有的设置都正确，那么这个文件将被 PHP 解析，浏览器中将会输出如下结果：

\begin{figure}[htbp]
	\centering
	\includegraphics{raw/PHP-hello.jpg}
	\caption{hello.php运行结果截图}
	\label{fig:PHP-hello}
\end{figure}

该程序非常简单，它仅仅只是利用了 PHP 的 echo 语句显示了 Hello World。因为使用了“.php”的扩展名，服务器已被配置成自动传递有着“.php”扩展名的文件给 PHP 解释器。PHP 解释器将相应的php代码解释成HTML内容后，再传递给用户。

一个普通的 HTML 文件，加上了几个特别的标签，就可以利用PHP做很多有趣的事情，充分体现了PHP作为web开发语言快速灵活的优势。

\subsection{文本编辑器}
理论上来讲，任何文本编辑器都可用来开发PHP程序。但综合考虑功能、价格、速度和可扩展性等等因素，我们推荐使用Sublime Text编辑器书写PHP代码。当然，如果经费充裕，可以考虑使用PHPStorm，PHPStorm是使用Java语言开发的一款功能强大的PHP IDE代码编辑器。Sublime Text的使用和配置，参见附录\ref{SublimeText}。

\subsection{PHP运行机制}
PHP说简单，但是要精通也不是一件简单的事。我们除了会使用之外，还得知道它底层的工作原理。PHP的运行机制实际上是从下到上的一个4层体系，具体见下图\ref{fig:PHP-system}：

\begin{figure}[htbp]
	\centering
	\includegraphics{raw/PHP-system.jpg}
	\caption{PHP的四层体系}
	\label{fig:PHP-system}
\end{figure}
下面对详细解释这四个层次的作用：
\begin{description}
	\item[Zend引擎] Zend整体用纯C实现，是PHP的内核部分，它将PHP代码翻译（词法、语法解析等一系列编译过程）为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构（如hashtable、oo）、内存分配及管理、提供了相应的api方法供外部调用，是一切的核心，所有的外围功能均围绕Zend实现。
	\item[Extensions] 围绕着Zend引擎，extensions通过组件式的方式提供各种基础服务，我们常见的各种内置函数（如array 系列）、标准库等都是通过extension来实现，用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的。
	\item[Sapi] ：Sapi全称是Server Application Programming Interface，也就是服务端应用编程接口，Sapi通过一系列钩子函数，使得PHP可以和外围交互数据，这是PHP非常优雅和成功的一个设计，通过sapi成功的将PHP本身和上层应用解耦隔离，PHP可以不再考虑如何针对不同应用进行兼容，而应用本身也可以针对自己的特点实现不同的处理方式。
	\item[上层应用] 这就是我们平时编写的PHP程序，通过不同的sapi方式得到各种各样的应用模式，如通过webserver实现web应用、在命令行下以脚本方式运行等等。
\end{description}

\bibliography{../bib/yangjh}
